package com.carlinfo.userscenter.users.service.impl;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import com.alibaba.fastjson.JSONObject;
import com.carlinfo.usercenter.common.service.impl.BaseServiceImpl;
import com.carlinfo.usercenter.common.util.ConstatFinalUtil;
import com.carlinfo.usercenter.common.util.DateUtil;
import com.carlinfo.usercenter.common.util.PageInfoUtil;
import com.carlinfo.userscenter.users.dao.IAAdminsDao;
import com.carlinfo.userscenter.users.dao.IARoleDao;
import com.carlinfo.userscenter.users.dao.impl.AAdminsDaoImpl;
import com.carlinfo.userscenter.users.dao.impl.ARoleDaoImpl;
import com.carlinfo.userscenter.users.pojo.AAdmins;
import com.carlinfo.userscenter.users.pojo.ARole;
import com.carlinfo.userscenter.users.pojo.ARoleMenu;
import com.carlinfo.userscenter.users.service.IAuthService;
import com.carlinfo.userscenter.users.service.IUsersService;
/**
 * usersService的实现类
 * @author jjh
 *
 */
public class UsersServiceImpl extends BaseServiceImpl implements IUsersService
{
	/* 角色的dao 
	 * 左边是父类
	 * 右边是子类
	 * 父类引用指向子类对象 */
	
	private IARoleDao roleDao = new ARoleDaoImpl();
	private IAAdminsDao adminsDao = new AAdminsDaoImpl();
	private IAuthService authService ;
	/**
	 * {
			// 响应码/
			"code":"0",
			//响应码的描述 
			"info":"成功",
			"data":
			{
				//id:
				"id":"",
				//sql语句影响的条数
				"effect":""
			}
		}
	 */
	
	@Override
	public JSONObject saveOneRoleService(ARole role)
	{
		JSONObject resultJSON = new JSONObject();
		/* dao的返回值指的是执行sql语句影响的条数 */
		int res = this.roleDao.saveDao(role);
		if(res > 0)
		{
			/* 添加成功 */
			JSONObject dataJSON = new JSONObject();
			/* 在JSON中,id是整数 */
			dataJSON.put("id", role.getId() + "") ;
			/* "" + 任何类型都是字符串 */
			dataJSON.put("effect", res + "");
			/* 将resultJSON和dataJSON关联起来 */
			resultJSON.put("data", dataJSON);
			resultJSON.put("code", "0");
			resultJSON.put("info", "添加成功");
		}else
		{
			/* 添加失败 */
			resultJSON.put("code", "1");
			resultJSON.put("effect", "添加失败");
		}
		return resultJSON;
	}

	/**
	 * {
			// 响应码/
			"code":"0",
			//响应码的描述 
			"info":"成功",
			"data":
			{
				//id:
				"id":"",
				//sql语句影响的条数
				"effect":""
			}
		}
	 */
	
	@Override
	public JSONObject updateOneRoleService(ARole role)
	{
		/* 创建JSON对象 */
		JSONObject resultJSON = new JSONObject();
		/* dao的返回值是执行sql语句影响数据库的条数*/
		int res = this.roleDao.updateDao(role);
		if(res > 0)
		{
			JSONObject dataJSON = new JSONObject();
			dataJSON.put("effect", res + "");
			/* 将resultJSON和dataJSON关联起来 */
			resultJSON.put("data", dataJSON);
			resultJSON.put("code", "0");
			resultJSON.put("info", "更新成功");
		}else
		{
			resultJSON.put("code", "1");
			resultJSON.put("info", "更新失败");
		}
		return resultJSON;
	}

	@Override
	public JSONObject deleteOneRoleService(ARole role)
	{
		/* 创建JSON对象 */
		JSONObject resultJSON = new JSONObject();
		/* dao的返回值是执行sql语句影响数据库的条数*/
		int res = this.roleDao.deleteDao(role);
		if(res > 0)
		{
			JSONObject dataJSON = new JSONObject();
			dataJSON.put("effect", res + "");
			/* 将resultJSON和dataJSON关联起来 */
			resultJSON.put("data", dataJSON);
			resultJSON.put("code", "0");
			resultJSON.put("info", "删除成功");
		}else
		{
			resultJSON.put("code", "1");
			resultJSON.put("info", "删除失败");
		}
		return resultJSON;
	}

	@Override
	public ARole findOneRoleService(Map<String, Object> condMap)
	{
		ARole role = this.roleDao.findDao(condMap);
		if("true".equalsIgnoreCase(condMap.get("extend") + ""))
		{
			Map<String,Object> extMap = new HashMap<String,Object>();
			/* 为角色菜单赋值 */
			extMap.clear();
			extMap.put("id", role.getId());
			List<ARoleMenu> roleMenuList = this.authService.findCountListRoleMenuService(null, extMap);
			role.setRoleMenuList(roleMenuList);
		}
		return role ;
	}

	@Override
	public List<ARole> findCountListRoleService(PageInfoUtil pageInfoUtil, Map<String, Object> condMap)
	{
		List<ARole> roleList = this.roleDao.findCountList(pageInfoUtil, condMap);
		if("true".equalsIgnoreCase(condMap.get("extend") + ""))
		{
			for (Iterator iterator = roleList.iterator(); iterator.hasNext();)
			{
				ARole role = (ARole) iterator.next();
				Map<String,Object> extMap = new HashMap<String,Object>();
				/* 为角色菜单赋值 */
				extMap.clear();
				extMap.put("id", role.getId());
				List<ARoleMenu> roleMenuList = this.authService.findCountListRoleMenuService(null, extMap);
				role.setRoleMenuList(roleMenuList);
			}
		}
		return roleList ;
	}

	/*-------------------管理员表操作开始-------------------*/
	
	/**
	 * {
			// 响应码/
			"code":"0",
			//响应码的描述 
			"info":"成功",
			"data":
			{
				//id:
				"id":"",
				//sql语句影响的条数
				"effect":""
			}
		}
	 */
	
	@Override
	public JSONObject saveOneAdminsService(AAdmins admins)
	{
		JSONObject resultJSON = new JSONObject();
		/* dao的返回值指的是执行sql语句影响的条数 */
		int res = this.adminsDao.saveDao(admins);
		if(res > 0)
		{
			/* 添加成功 */
			JSONObject dataJSON = new JSONObject();
			/* 在JSON中,id是整数 */
			dataJSON.put("id", admins.getId() + "") ;
			/* "" + 任何类型都是字符串 */
			dataJSON.put("effect", res + "");
			/* 将resultJSON和dataJSON关联起来 */
			resultJSON.put("data", dataJSON);
			resultJSON.put("code", "0");
			resultJSON.put("info", "添加成功");
		}else
		{
			/* 添加失败 */
			resultJSON.put("code", "1");
			resultJSON.put("effect", "添加失败");
		}
		return resultJSON;
	}

	@Override
	public JSONObject saveOneAdminsService(AAdmins admins, Map<String, Object> condMap)
	{
		/* 先处理对象,保存到数据库 */
		JSONObject resultJSON = this.saveOneAdminsService(admins);
		/*
		 * 然后处理图片
		 * 直接从Map中取值,在使用的时候,一定要先放值
		 */
		String fileName  = condMap.get("fileName") + ""; 
		/* 只有保存成功的时候才更新头像 */
		if(condMap.get("fileName") != null && !"".equalsIgnoreCase(fileName) && "0".equalsIgnoreCase(resultJSON.getString("code")))
		{
			/*
			 * 拷贝之前,需要拼装好目标文件的路径;
			 * 文件的绝对路径:用于本地文件的拷贝;D:\ usercenter-model2\ WebContent\ uploadfile\ jj.jpg
			 * 文件的网路路径:是用于在浏览器上显示(通过网络);http://localhost:8080/usercenter_20180108_model2/uploadfile/jj.jpg
			 * 相对路径:存储于数据库;/uploadfile/jj.jpg
			 * /uploadfile/admins/2020-12-28/uuid.jpg(为了让文件名不一样,引入一个uuid);
			 * 也可以使用时间
			 * uuid:本机产生的字符串永远不一样
			 * guid:全球所有的电脑产生的字符串都不一样
			 * 
			 * 文件名a.g.h.h.jpg;扩展名:jpg
			 */
			DateUtil dateUtil = new DateUtil();
			String relaPath = ConstatFinalUtil.BUNDLE.getString("upload.relaPath") + "/admins/" + dateUtil.datetoStr(new Date()) + "/"
					+ UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."), fileName.length()) ;
			System.out.println("===relaPath==" + relaPath);
			/*
			 * 绝对路径
			 * 硬盘上的路径 + 相对路径
			 */
			String absPath = ConstatFinalUtil.BUNDLE.getString("upload.absPath");
			
			/* 产生文件 */
			File tarFile = new File(absPath + relaPath);
			/* 上传了文件 */
			InputStream is = (InputStream) condMap.get("is");
			/* 拷贝文件
			 * 判断一下目标文件*/
			if(!tarFile.getParentFile().exists())
			{
				/*
				 * 创建文件所在的文件夹
				 * mkdir:创建一级目录
				 * mddirs:创建多级目录
				 * 有区别
				 */
				tarFile.getParentFile().mkdirs();
			}
			
			try
			{
				/* 文件肯定存在 */
				FileOutputStream fos = new FileOutputStream(tarFile);
				boolean flag = fileUtil.copy(is,fos);
				if(!flag)
				{
					System.out.println("===拷贝文件失败了==" + tarFile.getPath());
				}
			} catch (FileNotFoundException e)
			{
				e.printStackTrace();
			}
			/* 数据库存储的是相对路径 */
			admins.setPhotoPath(relaPath);
			/*
			 * 更新数据库
			 * 就是为了更新头像,直接调用dao就可以了
			 * 比较特殊
			 */
			this.adminsDao.updateDao(admins);
		}
		return resultJSON;
	}
	
	@Override
	public JSONObject updateOneAdminsService(AAdmins admins)
	{
		JSONObject resultJSON = new JSONObject();
		/* dao的返回值指的是执行sql语句影响的条数 */
		int res = this.adminsDao.updateDao(admins);
		if(res > 0)
		{
			/* 添加成功 */
			JSONObject dataJSON = new JSONObject();
			/* 在JSON中,id是整数 */
			dataJSON.put("id", admins.getId() + "") ;
			/* "" + 任何类型都是字符串 */
			dataJSON.put("effect", res + "");
			/* 将resultJSON和dataJSON关联起来 */
			resultJSON.put("data", dataJSON);
			resultJSON.put("code", "0");
			resultJSON.put("info", "更新成功");
		}else
		{
			/* 添加失败 */
			resultJSON.put("code", "1");
			resultJSON.put("effect", "更新失败");
		}
		return resultJSON;
	}

	@Override
	public JSONObject deleteOneAdminsService(AAdmins admins)
	{
		JSONObject resultJSON = new JSONObject();
		/* dao的返回值指的是执行sql语句影响的条数 */
		int res = this.adminsDao.deleteDao(admins);
		if(res > 0)
		{
			/* 添加成功 */
			JSONObject dataJSON = new JSONObject();
			/* 在JSON中,id是整数 */
			dataJSON.put("id", admins.getId() + "") ;
			/* "" + 任何类型都是字符串 */
			dataJSON.put("effect", res + "");
			/* 将resultJSON和dataJSON关联起来 */
			resultJSON.put("data", dataJSON);
			resultJSON.put("code", "0");
			resultJSON.put("info", "删除成功");
		}else
		{
			/* 添加失败 */
			resultJSON.put("code", "1");
			resultJSON.put("effect", "删除失败");
		}
		return resultJSON;
	}

	@Override
	public AAdmins findOneAdminsService(Map<String, Object> condMap)
	{
		AAdmins admins =  this.adminsDao.findDao(condMap);
		/* 关联关系的开关 */
		if("true".equalsIgnoreCase(condMap.get("extend") + ""))
		{
			/* 查询扩展表的条件 */
			Map<String, Object> extendMap = new HashMap<String, Object>();
			/* 根据id查询角色 
			 * 是通过管理员获取角色的id
			 * */
			extendMap.put("id", admins.getRoleId()) ;
			ARole role = this.findOneRoleService(extendMap);
			admins.setRole(role);
		}
		return admins ; 
	}

	@Override
	public List<AAdmins> findCountListAdminsService(PageInfoUtil pageInfoUtil, Map<String, Object> condMap)
	{
		List<AAdmins> resultList =  this.adminsDao.findCountList(pageInfoUtil,condMap);
		
		/* 关联关系的开关 */
		if("true".equalsIgnoreCase(condMap.get("extend") + ""))
		{
			/* 查询扩展表的条件 */
			Map<String, Object> extendMap = new HashMap<String, Object>();
			for (Iterator<AAdmins> iterator = resultList.iterator(); iterator.hasNext();)
			{
				AAdmins admins = (AAdmins) iterator.next();
				/* 根据id查询角色 
				 * 是通过管理员获取角色的id
				 * */
				extendMap.put("id", admins.getRoleId()) ;
				ARole role = this.findOneRoleService(extendMap);
				admins.setRole(role);
			}
		}
		return resultList ; 
	}

	public void setAuthService(IAuthService authService)
	{
		this.authService = authService;
	}

	/*-------------------管理员表操作结束-------------------*/
}
